<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 父亲的属性和方法 

        // 儿子也想拿到  

        // 七个 葫芦娃     葫芦娃的爸爸
        
        

        // 1. 原型继承
        // 子类的原型  =  父类的实例 
        // 好处 : 既能够继承属性 又能继承方法 
        // 坏处: 没有自己的原型 继承的属性不在自己身上 在原型  
        // 2. 借用构造函数继承
        // 把父类的构造函数当做普通函数对待 
        // 借用call方法 将父类的构造函数的this指向子类的实例
        // 优点: 可以继承父类的属性
        // 缺点: 不能继承父类的方法
        // 3. 组合继承 原型继承 + 构造函数继承
        // 优点  把属性继承到自己身上  把方法继承到原型上
        // 缺点: 原型上多了一套属性 

        // 4. 拷贝继承 
        // 遍历父类的实例(对象)  
        // 把父类的实例(对象)的属性和方法 
        // 拷贝到子类的原型上
        // 父亲的属性和方法都放到了子类的原型上
        // 自己身上没有属性和方法
        // 5. 寄生继承
        // 把父类的原型赋值给子类的原型(只能拿到方法) + 借用构造函数继承(只能拿到属性)
        

        // 6. 冒充继承
        // 浅拷贝+ 寄生继承
        /// es5 

        // function Person(name,age){  
        //       this.name = name;
        //       this.age = age; 
        // }

        // Person.prototype.sayHello = function(){
        //     console.log('我是原型继承');
        // }
        
    //    function Student(gender,...args){
    //         this.gender = gender;
    //         Person.call(this,...args); // 构造函数继承
           
    //    }

       
    // //    Student.prototype = Person.prototype; 
    // function third(){
    // }
      
    // third.prototype = Person.prototype;
    // // 寄生的写法  
    // Student.prototype = new third();
    
    // const s1 = new Student('男','张三',18);
    // console.log(s1);


    //     console.log(s1.name);
    //     console.log(s1.age);
    //     s1.sayHello();
    // (function(){
    //     let a = 100
    //     console.log(a);
    // })()

    // // 我想得到一个继承好的子类  
    // const MyStudent = (function(){
    //     function Person(name,age){  
    //         this.name = name;
    //         this.age = age; 
    //     }
    //     Person.prototype.sayHello = function(){
    //         console.log('我是原型继承');
    //     }

    //     function Student(gender,...args){
    //         this.gender = gender;
    //         Person.call(this,...args); // 构造函数继承
    //     }

    //     function Third(){
    //     }
    //     Third.prototype = Person.prototype;
    //     Student.prototype = new Third();
    //     Student.prototype.constructor = Student;
    //     return Student
    // })()

    // const s1 = new MyStudent('男','张三',18);
    // console.log(s1);

    </script>
</body>
</html>